﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Linq;

namespace BibliotecaDigital
{
    public partial class fConsultaInfo : BibliotecaDigital.fModeloForm
    {
        public fConsultaInfo()
        {
            InitializeComponent();
        }

        private void lvResultado_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void fConsultaInfo_Load(object sender, EventArgs e)
        {
            montaComboAtividades();
            montaComboCategorias();
            montaComboAssuntos();

            cbAtividade.SelectedIndex = -1;
            cbCategoria.SelectedIndex = -1;
            cbAssunto.SelectedIndex = -1;
        }

        private IEnumerable<Atividade> listarAtividades()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var atividades = from a in conn.Atividade orderby a.Descricao select a;
            return atividades;
        }

        private IEnumerable<Categoria> listarCategorias()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var categorias = from a in conn.Categoria
                             where a.IdAtividade == (cbAtividade.SelectedValue == null ? 0 : (int)cbAtividade.SelectedValue)
                             orderby a.Descricao
                             select a;
            return categorias;
        }

        private IEnumerable<Assunto> listarAssuntos()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var assuntos = from a in conn.Assunto
                           where a.IdAtividade == (cbAtividade.SelectedValue == null ? 0 : (int)cbAtividade.SelectedValue)
                           && a.IdCategoria == (cbCategoria.SelectedValue == null ? 0 : (int)cbCategoria.SelectedValue)
                           orderby a.Descricao
                           select a;
            return assuntos;
        }

        private IEnumerable<Titulo> listarTitulos()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            var titulos = from a in conn.Titulo
                          where a.IdAtividade == (cbAtividade.SelectedValue == null ? 0 : (int)cbAtividade.SelectedValue)
                          && a.IdCategoria == (cbCategoria.SelectedValue == null ? 0 : (int)cbCategoria.SelectedValue)
                          && a.IdAssunto == (cbAssunto.SelectedValue == null ? 0 : (int)cbAssunto.SelectedValue)
                          orderby a.Descricao
                          select a;
            return titulos;
        }

        private void montaComboAtividades()
        {
            cbAtividade.DataSource = null;
            cbAtividade.DataSource = listarAtividades();
            cbAtividade.ValueMember = "id";
            cbAtividade.DisplayMember = "descricao";
        }

        private void montaComboCategorias()
        {
            cbCategoria.DataSource = null;
            cbCategoria.DataSource = listarCategorias();
            cbCategoria.ValueMember = "id";
            cbCategoria.DisplayMember = "descricao";
        }

        private void montaComboAssuntos()
        {
            cbAssunto.DataSource = null;
            cbAssunto.DataSource = listarAssuntos();
            cbAssunto.ValueMember = "id";
            cbAssunto.DisplayMember = "descricao";
        }

        private void montaComboTitulos()
        {
            cbTitulo.DataSource = null;
            cbTitulo.DataSource = listarTitulos();
            cbTitulo.ValueMember = "id";
            cbTitulo.DisplayMember = "descricao";
        }

        private void cbAtividade_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void cbAtividade_SelectedValueChanged(object sender, EventArgs e)
        {
            montaComboCategorias();
        }

        private void cbCategoria_SelectedValueChanged(object sender, EventArgs e)
        {
            montaComboAssuntos();
        }

        private void btPesqAtv_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Atividade>)cbAtividade.DataSource,
                "id", "descricao", "Atividades"));
            if (selecao != null)
                cbAtividade.SelectedValue = selecao;
        }

        private void btPesqCat_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Categoria>)cbCategoria.DataSource,
                "id", "descricao", "Categorias"));
            if (selecao != null)
                cbCategoria.SelectedValue = selecao;
        }

        private void button8_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Assunto>)cbAssunto.DataSource,
                "id", "descricao", "Assuntos"));
            if (selecao != null)
                cbAssunto.SelectedValue = selecao;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            cbAtividade.SelectedIndex = -1;
            lvResultado.Items.Clear();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            pesquisar();
        }

        private String montaTextosPesquisa(String original)
        {
            String[] palavras = original.Split(',');
            String palavraAcumulada = String.Empty;            
            foreach(String palavra in palavras) {
                String palavraNova = palavra.Replace("*","%");
                if (palavraNova.Contains('%'))
                {
                    palavraAcumulada += " AND field LIKE '" + palavraNova+"'";
                }
                else if (palavraNova.StartsWith("-"))
                {
                    palavraAcumulada += " AND field <> '" + palavraNova.Substring(1) + "'";
                }
                else if (palavraNova.StartsWith("+"))
                {
                    palavraAcumulada += " AND field = '" + palavraNova.Substring(1) + "'";
                }
                else if (palavraNova.StartsWith("|"))
                {
                    palavraAcumulada += " OR field = '" + palavraNova + "'";
                }
                else
                    palavraAcumulada += " AND field = '" + palavraNova + "'";

            }

            return palavraAcumulada;
        }

        private void pesquisar()
        {
            bibliotecaContext conn = new bibliotecaContext(constantes.getPathConnection());
            conn.Log = Console.Out;
            var resultados = from inf in conn.Registro
                             join atv in conn.Atividade on inf.IdAtividade equals atv.Id
                             join cat in conn.Categoria on inf.IdCategoria equals cat.Id
                             join ass in conn.Assunto on inf.IdAssunto equals ass.Id
                             join tit in conn.Titulo on inf.IdTitulo equals tit.Id
                             //where inf.PalavraChave.Contains(tbPalavraChave.Text)
                             orderby atv.Descricao, cat.Descricao, ass.Descricao, inf.Id
                             select new
                             {
                                 idRegistro = inf.Id,
                                 idAtividade = inf.IdAtividade,
                                 idCategoria = inf.IdCategoria,
                                 idAssunto = inf.IdAssunto,
                                 idTitulo = inf.IdTitulo,
                                 titulo = tit.Descricao,
                                 palavraChave = inf.PalavraChave,
                                 nomeAtividade = atv.Descricao,
                                 nomeCategoria = cat.Descricao,
                                 nomeAssunto = ass.Descricao,
                             };

            if (cbAtividade.SelectedIndex != -1)
                resultados = resultados.Where(l=> l.idAtividade == (int)cbAtividade.SelectedValue);
            if (cbCategoria.SelectedIndex != -1)
                resultados = resultados.Where(l=> l.idCategoria == (int)cbCategoria.SelectedValue);
            if (cbAssunto.SelectedIndex != -1)
                resultados = resultados.Where(l => l.idAssunto == (int)cbAssunto.SelectedValue);
            if (cbTitulo.SelectedIndex != -1)
                resultados = resultados.Where(l => l.idTitulo == (int)cbTitulo.SelectedValue);

            //String condicao = montaTextosPesquisa(tbTitulo.Text);
            String condicao = String.Empty;

            ListViewItem novoItem;
            lvResultado.Items.Clear();
            if (resultados == null || resultados.Count() == 0) return;
            foreach (var resultado in resultados)
            {
                novoItem = new ListViewItem();
                novoItem.Text = resultado.nomeAtividade;
                novoItem.SubItems.Add(resultado.nomeCategoria);
                novoItem.SubItems.Add(resultado.nomeAssunto);
                novoItem.SubItems.Add(resultado.idRegistro.ToString());
                lvResultado.Items.Add(novoItem);
            }
        }

        private void lvResultado_DoubleClick(object sender, EventArgs e)
        {
            if (lvResultado.SelectedItems.Count > 0)
            {
                fRegInfo fRegInf = new fRegInfo();
                fRegInf.MdiParent = MdiParent;
                fRegInf.idRegistroCarregar = Convert.ToInt32(lvResultado.SelectedItems[0].SubItems[3].Text);
                fRegInf.Show();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            lvResultado_DoubleClick(sender, e);
        }

        private void cbAssunto_SelectedIndexChanged(object sender, EventArgs e)
        {
            montaComboTitulos();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            int? selecao = Convert.ToInt32(InputBox.showList((IEnumerable<Titulo>)cbTitulo.DataSource,
                "id", "descricao", "Títulos"));
            if (selecao != null)
                cbTitulo.SelectedValue = selecao;
        }
    }
}
